package interface_class;

import java_interface.Student;

import java.util.Arrays;

/**
 * @author : niu niu
 * @version : 1.0.0
 * @date : 2022/9/18 20:07
 * java 中的接口：
 *     1. java.lang.Comparable接口，当一个类实现Comparable接口，就表示当前类具备了可比较的能力
 *
 *      对于自定义的类，要想这个类具备“可比较的能力”，可以实现java.lang.Comparable接口，覆写其中的compareTo()方法
 *      返回值为整形，三种情况：<0 当前对象小于传入对象      =0  当前对象等于传入对象     >0 当前对象大于传入对象
 *
 *     2. java.lang.Cloneable 接口，当一个类具备了可被"克隆"的能力，没有抽象方法，所以实现这个接口后，啥方法都没覆写，不报错
 *          没有任何抽象方法的接口，称之为 标记接口，
 *          JVM只会标记识别所有带这个接口的子类，打上可复制的标记
 *          再调用Object继承的clone方法，实现克隆。（没有实现Cloneable接口，就无法调用）
 *
 *     深浅拷贝：
 *      浅拷贝：对象内部若包含其他类对象，浅拷贝只会复制地址值，并不会产生新的对象
 *      深拷贝：对象内部若包含其他类对象，产生新的对象，将原对象的内容复制过来 ，
 *              java中可以递归调用clone方法实现深拷贝
 *              通过序列化的方式实现深拷贝---->序列化：将任何对象变为字符串的过程///反序列化：将字符串还原为原来对象 （json字符串）
 *
 *
 */
public class Test {
    public static void main(String[] args) {
        //创建一个对象数组
        Student[] students = new Student[4];
        students[0]=new Student("66",90);
        students[1]=new Student("77",80);
        students[2]=new Student("88",60);
        students[3]=new Student("99",100);
        //现在根据每个学生的成绩进行排序，按照成绩进行升序排序
        //数组中有个工具类：Arrays.sort(数组对象)排序，默认升序
        int[] data = new int[]{1,2,4,5,64,22,12};
        Arrays.sort(data);
        System.out.println(Arrays.toString(data));
        //java_interface.Student cannot be cast to java.lang.Comparable
        sort(students);
        System.out.println(students[0].getScore());
        //实现接口之后
        Arrays.sort(students);//默认是升序，若想降序，修改Student类中的compareTo方法中的返回值即可
        for(Student student:students){
            student.showStu();
        }
    }

    /**
     * 实现sort方法
     * 调用sort方法时，不知道，也不关心具体的子类是什么类型，只要子类实现了Comparable接口
     * 都可以调用sort方法
     * 向上转型的参数统一化
     * @param arr
     */
    public static void sort(Comparable[] arr){
        for (int i = 0; i < arr.length-1; i++) {
            boolean isWaped = false;
            for (int j = 0; j < arr.length-1-i; j++) {
                if (arr[i].compareTo(arr[j+1])>0){
                    Comparable tep =arr[j+1];
                    arr[j+1]=arr[j];
                    arr[j]=tep;
                    isWaped = true;
                }

            }
            if (!isWaped){
                break;
            }
        }
    }
}
